package de.nak.terminumfrageapp.action;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

import de.nak.terminumfrageapp.model.Benutzer;
import de.nak.terminumfrageapp.model.Rueckmeldung;
import de.nak.terminumfrageapp.model.Termin;
import de.nak.terminumfrageapp.model.Umfrage;
import de.nak.terminumfrageapp.service.IBenutzerService;
import de.nak.terminumfrageapp.service.IRueckmeldungService;
import de.nak.terminumfrageapp.service.ITerminService;
import de.nak.terminumfrageapp.service.IUmfrageService;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

/**
 * 
 * @author Tim Danker
 * @description Action fuer umfrageDetailsForm.jsp
 * 
 */
@SuppressWarnings("serial")
public class UmfrageDetailsZeigenAction extends ActionSupport {
	/** Services */
	private IRueckmeldungService rueckmeldungService;
	private IUmfrageService umfrageService;
	private IBenutzerService benutzerService;
	private ITerminService terminService;
	/** Variablen */
	private Long RueckmeldungId;
	private Benutzer benutzer;
	private Boolean zusage;
	private Long gewaehlteUmfrage;
	private Umfrage umfrage;
	private Boolean istErstellerGleichBenutzer;
	/** Listen und ArrayListen */
	private List<Termin> terminListe;
	private ArrayList<Integer> terminIdListe;
	private ArrayList<Integer> benutzerIdListe;
	private ArrayList<Integer> benutzerInteger;
	private ArrayList<Benutzer> benutzerListeMitZusagen;
	private ArrayList<Long> anzahlZusagenProTermin;
	/**  Arrays */
	private String[] meineZusagen;
	private Rueckmeldung[][] arrayVonRueckmeldungenAndere;
	private Rueckmeldung[][] arrayVonRueckmeldungenEigene;
	
	/** Getter und Setter */
	public Boolean getIstErstellerGleichBenutzer() {
		return istErstellerGleichBenutzer;
	}

	public void setIstErstellerGleichBenutzer(Boolean istErstellerGleichBenutzer) {
		this.istErstellerGleichBenutzer = istErstellerGleichBenutzer;
	}

	public String[] getMeineZusagen() {
		return meineZusagen;
	}

	public void setMeineZusagen(String[] meineZusagen) {
		this.meineZusagen = meineZusagen;
	}

	public ArrayList<Benutzer> getBenutzerListeMitZusagen() {
		return benutzerListeMitZusagen;
	}

	public void setBenutzerListeMitZusagen(
			ArrayList<Benutzer> benutzerListeMitZusagen) {
		this.benutzerListeMitZusagen = benutzerListeMitZusagen;
	}

	public ArrayList<Long> getAnzahlZusagenProTermin() {
		return anzahlZusagenProTermin;
	}

	public void setAnzahlZusagenProTermin(ArrayList<Long> anzahlZusagenProTermin) {
		this.anzahlZusagenProTermin = anzahlZusagenProTermin;
	}

	public List<Integer> getTerminIdListe() {
		return terminIdListe;
	}

	public void setTerminIdListe(ArrayList<Integer> terminIdListe) {
		this.terminIdListe = terminIdListe;
	}

	public List<Integer> getBenutzerIdListe() {
		return benutzerIdListe;
	}

	public void setBenutzerIdListe(ArrayList<Integer> benutzerIdListe) {
		this.benutzerIdListe = benutzerIdListe;
	}

	public List<Termin> getTerminListe() {
		return terminListe;
	}

	public void setTerminListe(List<Termin> terminListe) {
		this.terminListe = terminListe;
	}

	public Rueckmeldung[][] getArrayVonRueckmeldungenEigene() {
		return arrayVonRueckmeldungenEigene;
	}

	public void setArrayVonRueckmeldungenEigene(
			Rueckmeldung[][] arrayVonRueckmeldungenEigene) {
		this.arrayVonRueckmeldungenEigene = arrayVonRueckmeldungenEigene;
	}

	public IRueckmeldungService getRueckmeldungService() {
		return rueckmeldungService;
	}

	public Umfrage getUmfrage() {
		return umfrage;
	}

	public void setRueckmeldungId(Long rueckmeldungId) {
		RueckmeldungId = rueckmeldungId;
	}

	public void setZusage(Boolean zusage) {
		this.zusage = zusage;
	}

	public void setUmfrage(Umfrage umfrage) {
		this.umfrage = umfrage;
	}

	public IRueckmeldungService getBRueckmeldungService() {
		return rueckmeldungService;
	}

	public Long getRueckmeldungId() {
		return RueckmeldungId;
	}

	public Boolean getZusage() {
		return zusage;
	}

	public Benutzer getBenutzer() {
		return benutzer;
	}

	public void setBenutzer(Benutzer benutzer) {
		this.benutzer = benutzer;
	}

	public void setRueckmeldungService(IRueckmeldungService rueckmeldungService) {
		this.rueckmeldungService = rueckmeldungService;
	}

	public void setUmfrageService(IUmfrageService umfrageService) {
		this.umfrageService = umfrageService;
	}

	public IUmfrageService getUmfrageService() {
		return umfrageService;
	}

	public IBenutzerService getBenutzerService() {
		return benutzerService;
	}

	public void setBenutzerService(IBenutzerService benutzerService) {
		this.benutzerService = benutzerService;
	}

	public ITerminService getTerminService() {
		return terminService;
	}

	public void setTerminService(ITerminService terminService) {
		this.terminService = terminService;
	}

	public Long getGewaehlteUmfrage() {
		return gewaehlteUmfrage;
	}

	public void setGewaehlteUmfrage(Long gewaehlteUmfrage) {
		this.gewaehlteUmfrage = gewaehlteUmfrage;
	}

	public void setArrayVonRueckmeldungenAndere(
			Rueckmeldung[][] arrayVonRueckmeldungenAndere) {
		this.arrayVonRueckmeldungenAndere = arrayVonRueckmeldungenAndere;
	}

	public Rueckmeldung getArrayVonRueckmeldungenAndere(Long a, Long b) {
		return arrayVonRueckmeldungenAndere[a.intValue()][b.intValue()];
	}

	public Rueckmeldung[][] getArrayVonRueckmeldungenAndere() {
		return arrayVonRueckmeldungenAndere;
	}

	public ArrayList<Integer> getBenutzerInteger() {
		return benutzerInteger;
	}

	public void setBenutzerInteger(ArrayList<Integer> benutzerInteger) {
		this.benutzerInteger = benutzerInteger;
	}
	
	/** Methoden */
	
	/**
	 * 
	 * @return "INPUT", "SUCCESS" oder "ERROR"
	 * @throws Exception
	 * @description diese Methode laedt alle Rueckmeldungen fuer eine
	 * 				mit gegebene Umfrage und fuellt die benoetigten 
	 * 				Informationen fuer die Oberflaeche in Variablen, 
	 * 				Listen und Arrays
	 */
	public String zeigeUmfrageDetail() throws Exception {
		//pruefen, ob eine Umfrage ausgewaehlt ist, sonst Error ausgeben
		if (gewaehlteUmfrage == null) {

			//keine Umfrage ausgewaehlt -> Warnung anzeigen, danach umfrageList anzeigen
			return ERROR;
			
		} else {
			//gewaehlte Umfrage laden
			umfrage = umfrageService.ladeUmfrage(gewaehlteUmfrage);
			
			//Benutzer-Informationen laden
			HttpServletRequest request = ServletActionContext.getRequest();
			HttpSession session = request.getSession();
			benutzer = benutzerService.benutzerLaden((Long) session
					.getAttribute("benutzerId"));
			
			//Variablen initialisieren
			terminIdListe = new ArrayList<Integer>();
			benutzerIdListe = new ArrayList<Integer>();
			anzahlZusagenProTermin = new ArrayList<Long>();
			benutzerInteger = new ArrayList<Integer>();
			
			//Terminliste laden
			terminListe = terminService.ladeAlleTermine(umfrage);
			
			//Integer Values der Termin-Ids in eine extra Liste schreiben
			//und ggf. eine Rueckmeldung fuer den Benutzer fuer jeden Termin anlegen
			for (Termin singleTermin : terminListe) {

				terminIdListe.add(singleTermin.getId().intValue());
				
				//pruefen ob, der Benutzer schon eine Rueckmeldung fuer den Termin
				//hat, ansonsten neue Rueckmeldung anlegen
				if (rueckmeldungService.hatBenutzerRueckmeldung(benutzer,
						singleTermin) == true) {
					//Benutzer hat noch keine Rueckmeldung fuer Termin ->
					//neue Rueckmeldung anlegen
					rueckmeldungService.erstelleRueckmeldung(singleTermin,
							benutzer, umfrage);
				}
			}
			
			//Array der eigenen Rueckmeldungen fuer alle Termine laden
			arrayVonRueckmeldungenEigene = rueckmeldungService
					.arrayVonEigenenRueckmeldungen(benutzer, terminListe);
			
			//Liste von Benutzer mit Zusagen fuer die Umfrage laden (ausgenommen,
			//die Zusage vom Benutzer selber)
			benutzerListeMitZusagen = (ArrayList<Benutzer>) rueckmeldungService
					.listeVonBenutzernMitZusage(umfrage, benutzer);
			
			//Liste mit Integer-IDs der Benutzer mit Zusagen erstellen
			if (benutzerListeMitZusagen.isEmpty() == false) {

				for (Benutzer singleBenutzer : benutzerListeMitZusagen) {
					benutzerIdListe.add(singleBenutzer.getId().intValue());
				}
			}
			
			//das Array mit Rueckmeldungen aller anderen Benutzer mit Zusagen fuer
			//die Umfrage laden (ausgenommen der Rueckmeldungen vom eigenen Benutzer)
			arrayVonRueckmeldungenAndere = rueckmeldungService
					.arrayVonRueckmeldungen(benutzerListeMitZusagen,
							terminListe, benutzer);
			
			
			//Anzahl der Zusagen fuer alle Termine laden
			anzahlZusagenProTermin = rueckmeldungService
					.ladeAnzahlZusagenProTermin(terminListe);

			
			//eigene BenutzerID als Integer-Value in eine Liste schreiben
			//WICHTIG: es muss an dieser Stelle unsinnigerweise eine Liste
			//benutzt werden, da eine einfache Variable innerhalb des
			//<s:iterator>-Tags sonst nicht benutzt werden koennte
			benutzerInteger.add(benutzer.getId().intValue());
			
			//pruefen, ob der angemeldete Benutzer gleich dem Ersteller
			//der Umfrage ist, wenn ja wird die Variable auf true gesetzt,
			//was zur Folge hat, dass an die eigenen Rueckmeldungen auf
			//der Oberflaeche nicht bearbeitet werden koennen
			istErstellerGleichBenutzer = new Boolean(false);
			if (benutzer.getId() == umfrage.getErsteller().getId()) {
				//Benutzer ist Ersteller => Rueckmeldungen nicht bearbeitbar
				setIstErstellerGleichBenutzer(true);
			} else {
				//Benutzer ist nicht Ersteller => Rueckmeldungen bearbeitbar
				setIstErstellerGleichBenutzer(false);
			}
			//zeige umfrageDetailsFrom
			return SUCCESS;
		}

	}

	/**
	 * 
	 * @return "SUCCESS"
	 * @throws Exception
	 * @description Diese Methode speichert fuer einen Benutzer
	 * 				seine Rueckmeldungen zu einer Umfrage.
	 * 				Hierfuer werden zunaechst alle seine 
	 * 				Rueckmeldungen auf 'false' gesetzt und dann
	 * 				aus dem String-Array das mit den Checkboxen
	 * 				verknuepft ist seine Zusagen ermittelt und
	 * 				gespeichert
	 */
	public String speichereUmfrageDetail() throws Exception {

		//Variablen initialisieren
		benutzerInteger = new ArrayList<Integer>();
		terminIdListe = new ArrayList<Integer>();
		
		//Terminliste laden
		terminListe = terminService.ladeAlleTermine(umfrage);
		
		//alle TerminIDs als Integer-Values einer Liste hinzufuegen
		for (Termin singleTermin : terminListe) {
			terminIdListe.add(singleTermin.getId().intValue());
		}
		
		//eigene Rueckmeldungen laden
		arrayVonRueckmeldungenEigene = rueckmeldungService
				.arrayVonEigenenRueckmeldungen(benutzer, terminListe);

		//eigene TerminID als Intever der Liste hinzufuegen
		benutzerInteger.add(benutzer.getId().intValue());

		
		

		// Rueckmeldungen nur neu speichern, wenn der Nutzer 
		// nicht der Ersteller ist,
		// da sonst durch die nicht-aktivierten Checkboxen 
		// die Zusagen geloescht wuerden.
		if (benutzer.getId() != umfrage.getErsteller().getId()) {
			
			//alle Rueckmeldungen fuer Benutzer auf 'false' setzen
			for (int singleTermId : terminIdListe) {
				Rueckmeldung aktuelleRueckmeldung = arrayVonRueckmeldungenEigene[benutzer
						.getId().intValue()][singleTermId];
				aktuelleRueckmeldung.setZusage(false);
				rueckmeldungService.speichere(aktuelleRueckmeldung);

			}

			//aus meineZusagen auslesen fuer welche Termine der Benutzer
			//zugesagt hat und fuer diese Termine die Rueckmeldung mit 'true'
			//speichern
			//meine Zusagen nicht null?
			if (meineZusagen != null) {
				for (String singleTermStringId : meineZusagen) {
					//wenn nichts ausgewaehlt wurde steht "false" im Array
					//dann soll es ignoriert werden
					if (singleTermStringId != "false") {
						//im Array stehen die TerminIDs als String-Werte
						//pro TerminID umwandeln in Integer-Wert
						int i = Integer.parseInt(singleTermStringId);
						//Rueckmeldung speichern
						Rueckmeldung aktuelleRueckmeldung = arrayVonRueckmeldungenEigene[benutzer
								.getId().intValue()][i];
						aktuelleRueckmeldung.setZusage(true);
						rueckmeldungService.speichere(aktuelleRueckmeldung);
					}
				}

			}

		}
		//zeige umfrageList
		return SUCCESS;
	}

}
